/*************************************************************************
* Tokens
************************************************************************/
//========================================================================
// Tokens: White space
//========================================================================
|
<DEFAULT> SKIP : {
<WHITESPACE: " " | "\t" | "\f">
}
|
<DEFAULT> SPECIAL : {
<NEWLINE: "\n" | "\r" | "\r\n">
}
|
//========================================================================
// Tokens: Comments
//========================================================================
|
<DEFAULT> TOKEN : {
<ANNOTATION_COMMENT_PREFIX: "#@<">
| <#REST_OF_LINE: (~["\n","\r"])* ("\n" | "\r" | "\r\n")?>
}
|
<DEFAULT> SPECIAL : {
<SINGLE_LINE_COMMENT: "#" (~["\n","\r"])* ("\n" | "\r" | "\r\n")?>
}
|
//========================================================================
// Tokens: Reserved words
//========================================================================
|
<DEFAULT> TOKEN : {
<ABSTRACT: "abstract">
| <BREAK: "break">
| <BY: "by">
| <CASE: "case">
| <CLASS: "class">
| <CREATE: "create">
| <THREAD: "thread">
| <CRITICAL: "critical">
| <DEFAULT_token: "default">
| <DO: "do">
| <ELSE: "else">
| <END: "end">
| <EVERY: "every">
| <FAIL: "fail">
| <GLOBAL: "global">
| <IF: "if">
| <IMPORT: "import">
| <IN: "in">
| <INITIAL: "initial">
| <INITIALLY: "initially">
| <INVOCABLE: "invocable">
| <LINK: "link">
| <LOCAL: "local">
| <METHOD: "method">
| <NEW: "new">
| <NEXT: "next">
| <NOT: "not">
| <NULL_LITERAL: "null">
| <OF: "of">
| <PACKAGE: "package">
| <PROCEDURE: "procedure">
| <RECORD: "record">
| <REPEAT: "repeat">
| <RETURN: "return">
| <STATIC: "static">
| <SUSPEND: "suspend">
| <THEN: "then">
| <TO: "to">
| <UNTIL: "until">
| <WHILE: "while">
}
|
//========================================================================
// Tokens: Separators
//========================================================================
|
<DEFAULT> TOKEN : {
<LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <LBRACKET: "[">
| <RBRACKET: "]">
| <SEMICOLON: ";">
| <COMMA: ",">
| <DOTDOTDOT: "...">
| <DOT: ".">
| <ANNOTATION: "@<">
| <AT: "@">
| <COMPR: "[:">
| <COMPREND: ":]">
| <COLON: ":">
| <COLONCOLON: "::">
| <LBRACE_EBCDIC: "$("> : {
| <RBRACE_EBCDIC: "$)"> : {
| <LBRACKET_EBCDIC: "$<"> : {
| <RBRACKET_EBCDIC: "$>"> : {
}
|
//========================================================================
// Tokens: Operators, grouped by precedence
//========================================================================
|
<DEFAULT> TOKEN : {
<AND: "&">
| <QMARK: "?">
| <ASSIGN: ":=">
| <REVASSIGN: "<-">
| <REVSWAP: "<->">
| <SWAP: ":=:">
| <PMATCH: "??">
| <POR: ".|">
| <BAR: "|">
| <PAND: "&&">
| <GT: ">">
| <LT: "<">
| <EQ: "==">
| <LE: "<=">
| <GE: ">=">
| <EQUALS: "=">
| <LSHIFT: "<<">
| <RSHIFT: ">>">
| <SLE: "<<=">
| <EQUIV: "===">
| <SGE: ">>=">
| <NMNE: "~=">
| <SNE: "~==">
| <NEQUIV: "~===">
| <PIMDASSN: "$$">
| <PASSNONMATCH: "->">
| <SND: "@>">
| <SNDBK: "@>>">
| <RCV: "<@">
| <RCVBK: "<<@">
| <CONCAT: "||">
| <LCONCAT: "|||">
| <PLUS: "+">
| <MINUS: "-">
| <INCR: "++">
| <DECR: "--">
| <STAR: "*">
| <SLASH: "/">
| <PERCENT: "%">
| <INTER: "**">
| <CARET: "^">
| <BANG: "!">
| <BACKSLASH: "\\">
| <TILDE: "~">
| <PSETCUR: ".$">
| <PIPE: "|>">
| <FUTURE: "|>>">
| <COEXPR: "|<>">
| <FIRSTCLASS: "<>">
| <PARALLEL: "|<>|">
| <BACKQUOTE: "`">
| <PCOLON: "+:">
| <MCOLON: "-:">
| <DOLLAR: "$">
| <AUGMOD: "%:=">
| <AUGAND: "&:=">
| <AUGSTAR: "*:=">
| <AUGINTER: "**:=">
| <AUGPLUS: "+:=">
| <AUGUNION: "++:=">
| <AUGMINUS: "-:=">
| <AUGDIFF: "--:=">
| <AUGSLASH: "/:=">
| <AUGNMLT: "<:=">
| <AUGSLT: "<<:=">
| <AUGSLE: "<<=:=">
| <AUGNMLE: "<=:=">
| <AUGNMEQ: "=:=">
| <AUGSEQ: "==:=">
| <AUGEQUIV: "===:=">
| <AUGNMGT: ">:=">
| <AUGNMGE: ">=:=">
| <AUGSGT: ">>:=">
| <AUGSGE: ">>=:=">
| <AUGQMARK: "?:=">
| <AUGAT: "@:=">
| <AUGCARET: "^:=">
| <AUGCONCAT: "||:=">
| <AUGNEQUIV: "~===:=">
| <AUGSNE: "~==:=">
| <AUGNMNE: "~=:=">
| <AUGLCONCAT: "|||:=">
}
|
//========================================================================
// Tokens: Numeric literals
//========================================================================
|
<DEFAULT> TOKEN : {
<INTEGER_LITERAL: <DECIMAL_LITERAL>>
| <RADIX_LITERAL: <DECIMAL_LITERAL> ["r","R"] (["0"-"9","a"-"f","A"-"F"])+>
| <#DECIMAL_LITERAL: (["0"-"9"])+>
| <REAL_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? | "." (["0"-"9"])+ (<EXPONENT>)? | (["0"-"9"])+ <EXPONENT>>
| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+>
}
|
<DEFAULT> MORE : {
"\"" : WithinQuote
}
|
<WithinQuote> SKIP : {
<"_" <NEWLINE> (<WHITESPACE>)*> : WithinQuote
}
|
<WithinQuote> TOKEN : {
<STRING_LITERAL: "\""> : DEFAULT
}
|
<WithinQuote> MORE : {
<~["\"","\\"] | <ESCAPE_LITERAL>>
}
|
//====================
// Single quote -- multiline continuations are as for double quotes.
//====================
|
<DEFAULT> MORE : {
"\'" : WithinSingleQuote
}
|
<WithinSingleQuote> SKIP : {
<"_" <NEWLINE> (<WHITESPACE>)*> : WithinSingleQuote
}
|
<WithinSingleQuote> TOKEN : {
<SINGLE_QUOTE_LITERAL: "\'"> : DEFAULT
}
|
<WithinSingleQuote> MORE : {
<~["\'","\\"] | <ESCAPE_LITERAL>>
}
|
//====================
// Quote regex dependencies
//====================
|
<DEFAULT> TOKEN : {
<#OLD_SINGLE_QUOTE_LITERAL: "\'" (~["\'","\\"] | <ESCAPE_LITERAL>)* "\'">
| <#OLD_STRING_LITERAL: "\"" (~["\"","\\"] | <ESCAPE_LITERAL>)* "\"">
| <#ESCAPE_LITERAL: "\\" (<HEX_ESCAPE> | <OCTAL_ESCAPE> | <CONTROL_ESCAPE> | ["!"-"~"," ","\t","\n","\r","\f"])>
| <#ESCAPE_LITERAL_NO_NL: "\\" (<HEX_ESCAPE> | <OCTAL_ESCAPE> | <CONTROL_ESCAPE> | ["!"-"~"," ","\t","\f"])>
| <#HEX_ESCAPE: ["x","X"] <HEX_DIGITS>>
| <#OCTAL_ESCAPE: ["0"-"7"] ["0"-"7"]>
| <#CONTROL_ESCAPE: "^" ["!"-"~"]>
| <#HEX_DIGITS: ["0"-"9","a"-"f","A"-"F"]>
}
|
//========================================================================
// Tokens: Big literals (Block quotes, or Big quotes)
//========================================================================
|
<DEFAULT> TOKEN : {
<BIG_LITERAL: "{<" (~[">","}","\\"] | ">" ~["}","\\"] | ~[">","\\"] "}" | ">" <ESCAPE_LITERAL> | <ESCAPE_LITERAL> ("}")?)* ([">","}"])? ">}">
}
|
//========================================================================
// Tokens: Identifiers
//========================================================================
|
<DEFAULT> TOKEN : {
<IDENTIFIER: <IDENTIFIER_BASE>>
| <#IDENTIFIER_BASE: <ALPHA> (<ALPHA> | <DIGIT>)*>
| <#ALPHA: ["A"-"Z","a"-"z","_"]>
| <#LETTER: ["$","A"-"Z","_","a"-"z","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u00ff","\u0100"-"\u1fff","\u3040"-"\u318f","\u3300"-"\u337f","\u3400"-"\u3d2d","\u4e00"-"\u9fff","\uf900"-"\ufaff"]>
| <#DIGIT: ["0"-"9","\u0660"-"\u0669","\u06f0"-"\u06f9","\u0966"-"\u096f","\u09e6"-"\u09ef","\u0a66"-"\u0a6f","\u0ae6"-"\u0aef","\u0b66"-"\u0b6f","\u0be7"-"\u0bef","\u0c66"-"\u0c6f","\u0ce6"-"\u0cef","\u0d66"-"\u0d6f","\u0e50"-"\u0e59","\u0ed0"-"\u0ed9","\u1040"-"\u1049"]>
}
|
/*************************************************************************
* LANGUAGE GRAMMAR STARTS HERE
************************************************************************/
//========================================================================
// Grammar
//========================================================================
/****
Tags for the generated XML syntax tree are as follows:
identifier # Atoms
literal @isInteger @isReal @isRadix (numbers)
literal @isQuote ("") @isSingleQuote ('') @isBigLiteral {< >}
literal @isWord (null)
andKeyword &i
methodref i.i::i | ((Cast) i).i::i # i::i called packageref in Unicon
packagref i.i::i # type instead of reference in expression above
dotname i.i # introduced atom when transforming commands, new allocation
operator @isAugment @isBoolean # Operators
delimiter @id ,;
keyword reserved word
assign x := y
product x & y
program # Program, everything is expression
expression
type # type, declaration, or atom used in expression
# e.g., declaration/ identifier | dotname
# atom/ identifier | dotname
declaration @isGlobalVariable, @isLocalVariable, @isParameter, @isClassOrMethod
comment #
newline
tuple (e,e) | (e) # Grouping
list [e,e] | [e] @isEmpty=true if empty list or map
block {e;e} | {e} @isClosure=true if body of closure
set {e,e}
map [e:e, ] | [e:e; ]
angleTuple |
comprehension [: e :] # list comprehension
# Expressions
# where e=expr, i=identifier, k=keyword, op=operator
annotation @<i i=e ...> e # Scoped annotations are a hybrid of XML and Java annotations
@</i> # Can omit end tag for non-strict XML
@<i i=e .../> e # Can use abbreviated empty-element tags
@<i(i=e,...)> e # Can also use Java style attributes
@<i(e)> e
directive $i e e # preprocessor
dollar $i(e,) # super invoke
keyvalue e:e
slice e..e
operation e op e | op e @isUnary @isBinary
qualified i:i:i | i:i=i | i=i | i:i # parameter declaration
statement k ... # declaration, or control construct
subscript [e,e] # when appears in index operation
closure (e,e) -> {e} # alternative: {(e,e) -> e}
# Declarations
dotname i.i # used in declarations, e.g., import and package
enum e,e | e e (open) # used in declarations
iterator (i in e) # Primaries
cast (type) e
invoke oe(,)[,] # where oe is (alloc | atom | group)
# Restricted to e(e) after transformation
index e[e] # Only introduced after transformation
objref oe(,)[,].f(,)[,] # where f is atom subset (identifier | methodref | "initially")
atom @emptyInner between or leading , or ; @emptyTrailing @allEmpty
group
command dotname|id|methodref expr ... # treated as dotname(expr,...)
# where expr is limited primary expression
# that starts with identifier or literal
allocation new e # where e is type
EXAMPLE: (x=1) =>
expr/group/list/{expr/operation/{expr/atom/identifier,operator=,expr/atom/literal}}
Concrete syntax tags: identifier, literal, keyword, operator, delimiter.
****/
//========================================================================
// Program structuring syntax follows.
//========================================================================
|
| ParseAndVisit |
::= |
Start <EOF> |
| Start |
::= |
( PackageDeclaration | ImportDeclaration | Link | Invocable | Record | Global | ProcedureNew | Procedure | Method | ClassDeclarationNew | ClassDeclaration | LocalDeclaration | BlockStatement | BlockAsExpr | LambdaAsExpr )* |
//====
// Junicon allows optional trailing semicolons in declarations.
//====
|
| PackageDeclaration |
::= |
( ( PACKAGE Type | PACKAGE TypeStringLiteral ) ( SEMICOL )? ) |
| ImportDeclaration |
::= |
( IMPORT ( NameOrStringList | TypeStringLiteral | ( STATIC )? ImportName ) ( SEMICOL )? ) |
| Link |
::= |
LINK NameOrStringList ( SEMICOL )? |
| Invocable |
::= |
INVOCABLE InvocList ( SEMICOL )? |
| InvocList |
::= |
Invocop ( COMMA Invocop )* |
| Invocop |
::= |
( TypeName | TypeStringLiteral COLON TypeIntLiteral | TypeStringLiteral ) |
| Directive |
::= |
DOLLAR Identifier SpacedArgList ( SEMICOL )? |
| Record |
::= |
( AnnotationType )? RECORD DeclaredName LPAREN ( ParamList )? RPAREN ( SEMICOL )? |
| Global |
::= |
( AnnotationType )? GLOBAL ( Type GlobalVarDeclList SEMICOL | GlobalVarDeclList ( SEMICOL )? ) |
//========================================================================
// Procedures.
//========================================================================
|
| Procedure |
::= |
ProcedurePrefix SEMICOL ProcBody END ( SEMICOL )? |
| ProcedureNew |
::= |
ProcedurePrefix ProcBodyNew ( SEMICOL )? |
| ProcedurePrefix |
::= |
( AnnotationType )? PROCEDURE DeclaredName LPAREN ( ParamList )? RPAREN |
| Initial |
::= |
INITIAL Expr SEMICOL |
| ProcBody |
::= |
( AllEmptyBlock | BlockLocals ( Initial )? ( ( BlockStatement )+ TrailingEmptyBlock | TrailingEmptyBlock ) ) |
| ProcBodyNew |
::= |
( LBRACE AllEmptyBlock RBRACE | LBRACE BlockLocals ( Initial )? ( TrailingEmptyBlock | ExprSequence ) RBRACE ) |
| LocalDeclaration |
::= |
LocalDeclarationPrefix ( Type VarInitList | VarInitList ) SEMICOL |
| LocalDeclarationNoSemicolon |
::= |
LocalDeclarationPrefix ( Type VarInitList | VarInitList ) |
| LocalDeclarationPrefix |
::= |
( AnnotationType )? ( LOCAL | STATIC ) |
//========================================================================
// Classes.
//========================================================================
|
| ClassDeclaration |
::= |
ClassPrefix ( SEMICOL )? ClassMethods END ( SEMICOL )? |
| ClassDeclarationNew |
::= |
ClassPrefix LBRACE ClassMethods RBRACE ( SEMICOL )? |
| ClassPrefix |
::= |
( AnnotationType )? CLASS DeclaredName ( Supers )? LPAREN ( ParamList )? RPAREN |
| ClassMethods |
::= |
( Method | Global | Record | LocalDeclaration | EmbeddedScript )* ( SEMICOL )? ( InitiallyNew | Initially )? |
| Supers |
::= |
COLON Super ( COLON Super )* |
| Super |
::= |
MethodRefType |
|
| |
Type |
| Initially |
::= |
InitiallyPrefix SEMICOL ProcBody |
| InitiallyNew |
::= |
InitiallyPrefix ProcBodyNew ( SEMICOL )? |
| InitiallyPrefix |
::= |
INITIALLY ( LPAREN ( ParamList )? RPAREN )? |
| Method |
::= |
( AbstractMethod | RealMethodNew | RealMethod ) |
| AbstractMethod |
::= |
MethodPrefix ( SEMICOL )? |
| RealMethod |
::= |
MethodPrefix SEMICOL ProcBody END ( SEMICOL )? |
| RealMethodNew |
::= |
MethodPrefix ProcBodyNew ( SEMICOL )? |
| MethodPrefix |
::= |
( AnnotationType )? ( ABSTRACT )? ( MethodModifiers )? METHOD DeclaredName LPAREN ( ParamList )? RPAREN |
| MethodModifiers |
::= |
STATIC |
//============================================================================
// Declared names (variables and parameters), Types, and Atoms in expressions.
//============================================================================
|
| IdList |
::= |
DeclaredName ( COMMA DeclaredName )* |
| DeclaredName |
::= |
Identifier |
| VarInitList |
::= |
VariableInitializer ( COMMA VariableInitializer )* |
| VariableInitializer |
::= |
( LocalVariable ASSIGN Expr | LocalVariable ) |
| LocalVariable |
::= |
Identifier |
| GlobalVarDeclList |
::= |
GlobalVariable ( COMMA GlobalVariable )* |
| GlobalVariable |
::= |
Identifier |
| ParamList |
::= |
( Params LBRACKET_TYPE RBRACKET_TYPE | Params ) |
| Params |
::= |
Param ( COMMA Param )* |
| Param |
::= |
( JavaTypedParameter | ( DeclaredParameterName ( COLON Type )? ( ( COLON | EQUALS ) TypeLiteral )? ) ) |
//====
// Parameter can be param[:type][: or =literal]
//====
|
| JavaTypedParameter |
::= |
ParameterType DeclaredParameterName ( ( EQUALS ) TypeLiteral )? |
| DeclaredParameterName |
::= |
Identifier |
| ParameterType |
::= |
( DotName | Identifier ) ( DOTDOTDOT )? |
| Type |
::= |
( GenericType | DotName | Identifier ) |
| GenericType |
::= |
DotNameMaybe LANGLE_TUPLE TypeList RANGLE_TUPLE |
| TypeList |
::= |
Type ( COMMA Type )* |
| TypeName |
::= |
Identifier |
| MethodRefType |
::= |
PackageRef |
| PackageRef |
::= |
( DotName COLONCOLON Identifier | SingleDotName COLONCOLON Identifier | EmptyDotName COLONCOLON Identifier ) |
| DotName |
::= |
Identifier ( DOT RelaxedIdentifier )+ |
| SingleDotName |
::= |
Identifier |
| EmptyDotName |
::= |
AllEmptyAtom |
| DotNameMaybe |
::= |
( DotName | Identifier ) |
| ImportName |
::= |
( ImportDotName | Identifier ) |
| ImportDotName |
::= |
Identifier ( DOT ( Identifier | STAR ) )+ |
| SpacedArgList |
::= |
( Identifier | Literal )* |
| NameOrStringList |
::= |
NameOrString ( COMMA NameOrString )* |
| NameOrString |
::= |
TypeName |
|
| |
TypeStringLiteral |
| TypeLiteral |
::= |
Literal |
| TypeStringLiteral |
::= |
StringLiteral |
| TypeIntLiteral |
::= |
IntLiteral |
//========================================================================
// Parameterized closure.
//========================================================================
|
| Closure |
::= |
LPAREN ( ParamList )? RPAREN ClosureOperator LBRACE ExprSequenceAsBlock RBRACE |
| ExprSequenceAsBlock |
::= |
( AllEmptyBlock | BlockLocals ( TrailingEmptyBlock | ExprSequence ) ) |
//========================================================================
// Block statements and bounded expressions.
//========================================================================
|
| Block |
::= |
LBRACE AllEmptyBlock RBRACE |
|
| |
LBRACE BlockLocals TrailingEmptyBlock RBRACE |
|
| |
LBRACE BlockLocals ExprSequence RBRACE |
| BlockLocals |
::= |
( LocalDeclaration )* |
| ExprSequence |
::= |
( InnerEmptyBlock | Nothing ) ( BlockExpr | Nothing ) ( SEMICOL BlockExpr | SEMICOL InnerEmptyBlock )* |
//====
// ExprSequence is to be non-empty, and ends with an expression or innerEmpty.
// If it would be empty, test and use allEmpty instead.
// Invariant: {AllEmpty} or {x;TrailingEmpty} or {x;y} where x may be InnerEmpty
//====
// We pad leading ";", trailing ";", and ";;" with an empty atom.
// We indicate an empty ExprSequence with AllEmpty().
// A trailing Empty() mimics Icon sequence semantics which ends with ;null.
// Transform must later detect last expr after semicolon to be unbounded.
//====
|
| BlockAsExpr |
::= |
BlockAsGroup |
| BlockAsGroup |
::= |
Block |
| LambdaAsExpr |
::= |
LambdaAsGroup |
| LambdaAsGroup |
::= |
Closure |
| AllEmptyExpr |
::= |
AllEmptyAtom |
| AllEmptyBlock |
::= |
|
| AllEmptyList |
::= |
|
| InnerEmptyBlock |
::= |
InnerEmptyAtom |
| InnerEmptyList |
::= |
InnerEmptyAtom |
| TrailingEmptyBlock |
::= |
TrailingEmptyAtom |
| TrailingEmptyList |
::= |
TrailingEmptyAtom |
| AllEmptyAtom |
::= |
|
| InnerEmptyAtom |
::= |
|
| TrailingEmptyAtom |
::= |
|
| BlockStatement |
::= |
InnerEmptyBlock SEMICOL |
|
| |
BoundedExpr SEMICOL |
//====
// Blockstatement ends with semicolon.
//====
|
| BlockExpr |
::= |
BoundedExpr |
//====
// BlockExpr need not have semicolon after it.
//====
|
| BoundedExpr |
::= |
( ( Annotation )+ PlainExpression | PlainExpression ) |
| Expr |
::= |
( ( Annotation )+ PlainExpression | PlainExpression ) |
| PlainExpression |
::= |
( Statement | Command | AndExpression ) |
| StatementExpression |
::= |
Statement |
//========================================================================
// Control constructs.
//========================================================================
|
| Statement |
::= |
( If | Case | While | Until | Every | Repeat | Create | Thread | Next | Break | Fail | Suspend | Return | Critical | Puneval ) |
| StatementLookahead |
::= |
( IF | CASE | WHILE | UNTIL | EVERY | REPEAT | CREATE | THREAD | NEXT | BREAK | FAIL | SUSPEND | RETURN | CRITICAL | PUNEVAL ) |
| If |
::= |
IF BoundedExpr THEN Expr ( ELSE Expr )? |
| Case |
::= |
CASE BoundedExpr OF LBRACE CaseList RBRACE |
| CaseList |
::= |
CaseItem ( SEMICOL CaseItem )* |
| CaseItem |
::= |
( ( BoundedExpr COLON Expr ) | ( DEFAULT COLON Expr ) ) |
| While |
::= |
WHILE BoundedExpr ( DO BoundedExpr )? |
| Until |
::= |
UNTIL BoundedExpr ( DO BoundedExpr )? |
| Every |
::= |
EVERY Expr ( DO BoundedExpr )? |
| Repeat |
::= |
REPEAT ( BoundedExpr )? |
| Create |
::= |
CREATE Expr |
| Thread |
::= |
THREAD Expr |
| Next |
::= |
NEXT |
| Break |
::= |
BREAK ( Expr | AllEmptyExpr ) |
| Fail |
::= |
FAIL |
| Suspend |
::= |
SUSPEND ( SuspendExpr | AllEmptyExpr ) |
| SuspendExpr |
::= |
Expr ( DO BoundedExpr )? |
| Return |
::= |
RETURN ( BoundedExpr | AllEmptyExpr ) |
| Critical |
::= |
CRITICAL BoundedExpr |
| Puneval |
::= |
PUNEVAL Expr |
| Command |
::= |
CommandNameAsAtom ( LimitedPrimaryExpression )+ |
| CommandNameAsAtom |
::= |
( MethodRef | DotName | StrictIdentifier ) |
| LimitedPrimaryExpression |
::= |
( LimitedObjectRef | LimitedInvokeExpr ) |
| LimitedObjectRef |
::= |
LimitedInvokeExpr DOT ( ( FieldExpression DOT )* FieldExpression ) |
| LimitedInvokeExpr |
::= |
SingleItem ( Arguments | ArraySuffix )* |
//========================================================================
// Expressions.
//========================================================================
//====
// Cascade down for precedence, low to high.
// Higher precedence operators bind more tightly, i.e., are executed first.
//====
|
| AndExpression |
::= |
QmarkExpression ( AND QmarkExpression )* |
//====
// Iterative production is left-associative.
//====
|
| QmarkExpression |
::= |
Assignment ( QMARK Assignment )* |
//====
// Recursive production is right-associative.
//====
|
| Assignment |
::= |
FirstClassExpression ( ( AssignOperator | AugmentedAssign ) Assignment )? |
//====
// Transform must detect Lhs of assign.
//====
|
| FirstClassExpression |
::= |
( FirstClassOperators )? PmatchExpression |
| PmatchExpression |
::= |
ToExpression ( PmatchOperators ToExpression )* |
//====
// Operations are only allowed to the left of a statement, e.g., if.
// Anything to the right of a statement will bind together.
//====
|
| ToExpression |
::= |
PorExpression ( TO PorExpression ( BY PorExpression )? )? |
| PorExpression |
::= |
BarExpression ( PorOperators BarExpression )* |
| BarExpression |
::= |
CompareExpression ( BarOperators CompareExpression )* |
| CompareExpression |
::= |
ConcatExpression ( CompareOperators ConcatExpression )* |
| ConcatExpression |
::= |
AddExpression ( ConcatOperators AddExpression )* |
| AddExpression |
::= |
MultiplyExpression ( AddOperators MultiplyExpression )* |
| MultiplyExpression |
::= |
CaretExpression ( MultiplyOperators CaretExpression )* |
//====
// CaretExpression is right associative via right recursion.
//====
|
| CaretExpression |
::= |
BangExpression ( CARET CaretExpression )? |
| BangExpression |
::= |
UnaryExpression ( BangOperators UnaryExpression )* |
//====
// UnaryExpression is right associative via right recursion.
//====
|
| UnaryExpression |
::= |
( ( StatementExpression | ( UnaryOperators | UnaryBooleanOperators | NOT ) UnaryExpression ) | PrimaryExpression ) |
//====
// Transform must detect that unary Not applies to boundedExpression()
//====
//========================================================================
// Primary expressions.
//========================================================================
|
| PrimaryExpression |
::= |
( CastExpression | CastEmbeddedScript | PrimaryExpressionNoCast ) |
| CastExpression |
::= |
Cast PrimaryExpressionNoCast |
| CastEmbeddedScript |
::= |
Cast EmbeddedScript |
| Cast |
::= |
LPAREN Type RPAREN |
| PrimaryExpressionNoCast |
::= |
( IteratorExpression | ObjectRef | InvokeExpr ) |
| InvokeExpr |
::= |
ObjectExpr ( Arguments | ArraySuffix )* |
//====
// InvokeExpr includes invoke as well as standalone atom and group.
//====
|
| ObjectExpr |
::= |
( AllocationExpr | MethodRefAsAtom | SingleItem | GroupExpr ) |
| ObjectRef |
::= |
InvokeExpr DOT ( ( FieldExpression DOT )* FieldExpression ) |
| FieldExpression |
::= |
Field ( Arguments | ArraySuffix )* |
//====
// ObjectExpr and FieldExpression in Java 8 use: [Arguments()] (ArraySuffix())*
//====
|
| Field |
::= |
( RelaxedIdentifier ) |
| AllocationExpr |
::= |
NEW Type |
| Arguments |
::= |
( Invoke | CoExprInvoke | SuperInvoke ) |
| Invoke |
::= |
LPAREN_EMPTY AllEmptyList RPAREN |
|
| |
LPAREN ExprList RPAREN |
| CoExprInvoke |
::= |
LBRACE_EMPTYSET AllEmptyList RBRACE_SET |
|
| |
LBRACE_SET ExprList RBRACE_SET |
| SuperInvoke |
::= |
DOLLAR ( INITIALLY | ( Identifier ( DOT Identifier | INITIALLY )? ) ) ( LPAREN_EMPTY AllEmptyList RPAREN | LPAREN ExprList RPAREN ) |
| ArraySuffix |
::= |
LBRACKET_EMPTYINDEX AllEmptyList RBRACKET_INDEX |
|
| |
LBRACKET_INDEX ( RangeExpr | ExprList ) RBRACKET_INDEX |
| RangeExpr |
::= |
Expr ( COLON | PCOLON | MCOLON ) Expr |
| SingleItem |
::= |
( Identifier | AndKeyword | Literal ) |
| GroupExpr |
::= |
( Closure | Tuple | Map | EmptyMapComprEnd | Set | Block | CaseMap | List | EmptyMapCompr | ListComprehension ) |
| IteratorExpression |
::= |
InIterator |
| ArgList |
::= |
ExprList |
| ExprList |
::= |
( InnerEmptyList | Nothing ) ( Expr | Nothing ) ( COMMA Expr | COMMA InnerEmptyList )* |
//====
// Exprlist is to be non-empty, and ends with an expression or innerEmpty.
// If it would be empty, test and use allEmpty instead.
// Invariant: (AllEmpty) or (x,TrailingEmpty) or (x,y) where x may be Empty
//====
// We pad leading ",", trailing ",", and ",," with Empty().
// We indicate an empty ExprList with AllEmpty().
//====
|
| RightDelim |
::= |
RPAREN |
|
| |
RBRACE |
|
| |
RBRACKET |
| Nothing |
::= |
|
| MethodRef |
::= |
( DotNameAsAtom COLONCOLON RelaxedIdentifier | SingleDotNameAsAtom COLONCOLON RelaxedIdentifier | CastDotNameAsAtom COLONCOLON RelaxedIdentifier | EmptyDotName COLONCOLON RelaxedIdentifier ) |
//====
// Methodref: x.y::f | ((Cast) x).y::f(z)
//====
|
| CastDotNameAsAtom |
::= |
CastInParen ( DOT Field )* |
| CastInParen |
::= |
LPAREN SimpleCastExpression RPAREN |
| SimpleCastExpression |
::= |
Cast IdentifierAsAtom |
| DotNameAsAtom |
::= |
IdentifierAsAtom ( DOT Field )+ |
| SingleDotNameAsAtom |
::= |
IdentifierAsAtom |
| IdentifierAsAtom |
::= |
Identifier |
| MethodRefAsAtom |
::= |
MethodRef |
//========================================================================
// Tuple, map, list, and set.
//========================================================================
|
| Tuple |
::= |
LPAREN_EMPTY AllEmptyList RPAREN |
|
| |
LPAREN ExprList RPAREN |
| List |
::= |
LBRACKET_EMPTYLIST AllEmptyList RBRACKET |
|
| |
LBRACKET ExprList RBRACKET |
| CaseMap |
::= |
LBRACKET_MAP CaseList RBRACKET_MAP |
| Map |
::= |
LBRACKET_EMPTYMAP COLON RBRACKET |
|
| |
LBRACKET_MAP MapList RBRACKET_MAP |
| MapList |
::= |
KeyColonValue ( COMMA KeyColonValue )* |
| KeyColonValue |
::= |
Expr COLON Expr |
| EmptyMapCompr |
::= |
COMPR_EMPTYMAP RBRACKET_MAP |
| EmptyMapComprEnd |
::= |
LBRACKET_EMPTYMAP COMPREND |
| Set |
::= |
LBRACE_SET ExprList RBRACE_SET |
| ListComprehension |
::= |
COMPR_EMPTY AllEmptyList COMPREND |
|
| |
COMPR Expr COMPREND |
//========================================================================
// Iterators.
//========================================================================
|
| InIterator |
::= |
( LPAREN COLON IN Expr RPAREN | LPAREN IdentifierAsExpr IN Expr RPAREN ) |
| IdentifierAsExpr |
::= |
IdentifierAsAtom |
| LiteralAsAtom |
::= |
Literal |
| BigLiteralAsAtom |
::= |
BigLiteral |
| BigLiteralAsExpr |
::= |
BigLiteralAsAtom |
//========================================================================
// Annotations.
//========================================================================
|
| AnnotationType |
::= |
Annotation |
| AnnotationComment |
::= |
( ANNOTATION_COMMENT_PREFIX SLASH XmlTag GT | XmlTag ( SpacedNamedArgList )? ( SLASH )? GT ) |
| Annotation |
::= |
( ANNOTATION SLASH XmlTag GT | ANNOTATION XmlTag LPAREN ( NamedArgList | AnnotationExpr )? RPAREN ( SLASH )? GT | ANNOTATION XmlTag ( SpacedNamedArgList )? ( SLASH )? GT ) |
| XmlTag |
::= |
RelaxedDotNameMaybe ( COLON RelaxedDotNameMaybe )? |
| RelaxedDotNameMaybe |
::= |
RelaxedIdentifier ( DOT RelaxedIdentifier )* |
| SpacedNamedArgList |
::= |
NamedArg ( NamedArg )* |
| NamedArgList |
::= |
NamedArg ( COMMA NamedArg )* |
| NamedArg |
::= |
Identifier EQUALS AnnotationExpr |
| AnnotationExpr |
::= |
Expr |
| EmbeddedScript |
::= |
AnnotationType BigLiteralAsExpr |
//========================================================================
// Grouped literals and keywords
//========================================================================
|
| Literal |
::= |
IntLiteral |
|
| |
RealLiteral |
|
| |
StringLiteral |
|
| |
CharLiteral |
|
| |
BigLiteral |
|
| |
NullLiteral |
| AndKeyword |
::= |
AND ( Identifier | Fail | NullLiteral ) |
/*************************************************************************
* TERMINALS START HERE
************************************************************************/
//========================================================================
// Terminals: Reserved Words
//========================================================================
|
| ABSTRACT |
::= |
<ABSTRACT> |
| BREAK |
::= |
<BREAK> |
| BY |
::= |
<BY> |
| CASE |
::= |
<CASE> |
| CLASS |
::= |
<CLASS> |
| CREATE |
::= |
<CREATE> |
| THREAD |
::= |
<THREAD> |
| CRITICAL |
::= |
<CRITICAL> |
| DEFAULT |
::= |
<DEFAULT_token> |
| DO |
::= |
<DO> |
| ELSE |
::= |
<ELSE> |
| END |
::= |
<END> |
| EVERY |
::= |
<EVERY> |
| FAIL |
::= |
<FAIL> |
| GLOBAL |
::= |
<GLOBAL> |
| IF |
::= |
<IF> |
| IMPORT |
::= |
<IMPORT> |
| IN |
::= |
<IN> |
| INITIAL |
::= |
<INITIAL> |
| INITIALLY |
::= |
<INITIALLY> |
| INVOCABLE |
::= |
<INVOCABLE> |
| LINK |
::= |
<LINK> |
| LOCAL |
::= |
<LOCAL> |
| METHOD |
::= |
<METHOD> |
| NEW |
::= |
<NEW> |
| NEXT |
::= |
<NEXT> |
| NOT |
::= |
<NOT> |
| OF |
::= |
<OF> |
| PACKAGE |
::= |
<PACKAGE> |
| PROCEDURE |
::= |
<PROCEDURE> |
| RECORD |
::= |
<RECORD> |
| REPEAT |
::= |
<REPEAT> |
| RETURN |
::= |
<RETURN> |
| STATIC |
::= |
<STATIC> |
| SUSPEND |
::= |
<SUSPEND> |
| THEN |
::= |
<THEN> |
| TO |
::= |
<TO> |
| UNTIL |
::= |
<UNTIL> |
| WHILE |
::= |
<WHILE> |
//========================================================================
// Terminals: Delimiters
//========================================================================
|
| LPAREN |
::= |
<LPAREN> |
| RPAREN |
::= |
<RPAREN> |
| LBRACE |
::= |
<LBRACE> |
| RBRACE |
::= |
<RBRACE> |
| LBRACE_CLOSURE |
::= |
<LBRACE> |
| RBRACE_CLOSURE |
::= |
<RBRACE> |
| LBRACE_SET |
::= |
<LBRACE> |
| RBRACE_SET |
::= |
<RBRACE> |
| LBRACKET |
::= |
<LBRACKET> |
| RBRACKET |
::= |
<RBRACKET> |
| LBRACKET_INDEX |
::= |
<LBRACKET> |
| RBRACKET_INDEX |
::= |
<RBRACKET> |
| LBRACKET_MAP |
::= |
<LBRACKET> |
| RBRACKET_MAP |
::= |
<RBRACKET> |
| LBRACKET_TYPE |
::= |
<LBRACKET> |
| RBRACKET_TYPE |
::= |
<RBRACKET> |
| LANGLE_TUPLE |
::= |
<LT> |
| RANGLE_TUPLE |
::= |
<GT> |
| COMPR |
::= |
<COMPR> |
| COMPREND |
::= |
<COMPREND> |
| LPAREN_EMPTY |
::= |
<LPAREN> |
| LBRACE_EMPTYSET |
::= |
<LBRACE> |
| LBRACKET_EMPTYINDEX |
::= |
<LBRACKET> |
| LBRACKET_EMPTYLIST |
::= |
<LBRACKET> |
| LBRACKET_EMPTYMAP |
::= |
<LBRACKET> |
| COMPR_EMPTYMAP |
::= |
<COMPR> |
| COMPR_EMPTY |
::= |
<COMPR> |
| SEMICOL |
::= |
<SEMICOLON> |
| COLON |
::= |
<COLON> |
| COLONCOLON |
::= |
<COLONCOLON> |
| COMMA |
::= |
<COMMA> |
| DOT |
::= |
<DOT> |
| DOTDOTDOT |
::= |
<DOTDOTDOT> |
//========================================================================
// Terminals: Operators
//========================================================================
|
| AND |
::= |
<AND> |
| QMARK |
::= |
<QMARK> |
| ASSIGN |
::= |
( <ASSIGN> ) |
| AssignOperator |
::= |
( <ASSIGN> | <REVASSIGN> | <REVSWAP> | <SWAP> ) |
| AugmentedAssign |
::= |
( <AUGMOD> | <AUGAND> | <AUGSTAR> | <AUGINTER> | <AUGPLUS> | <AUGUNION> | <AUGMINUS> | <AUGDIFF> | <AUGSLASH> | <AUGNMLT> | <AUGSLT> | <AUGSLE> | <AUGNMLE> | <AUGNMEQ> | <AUGSEQ> | <AUGEQUIV> | <AUGNMGT> | <AUGNMGE> | <AUGSGT> | <AUGSGE> | <AUGQMARK> | <AUGAT> | <AUGCARET> | <AUGCONCAT> | <AUGNEQUIV> | <AUGSNE> | <AUGNMNE> | <AUGLCONCAT> ) |
| PmatchOperators |
::= |
<PMATCH> |
| PorOperators |
::= |
<POR> |
| BarOperators |
::= |
( <BAR> | <PAND> ) |
| ClosureOperator |
::= |
( <PASSNONMATCH> ) |
| CompareOperators |
::= |
( <GT> | <LT> | <EQ> | <LE> | <GE> | <EQUALS> | <LSHIFT> | <RSHIFT> | <SLE> | <EQUIV> | <SGE> | <NMNE> | <SNE> | <NEQUIV> | <PIMDASSN> | <PASSNONMATCH> ) |
| ConcatOperators |
::= |
( <CONCAT> | <LCONCAT> ) |
| AddOperators |
::= |
( <PLUS> | <MINUS> | <INCR> | <DECR> ) |
| MultiplyOperators |
::= |
( <STAR> | <SLASH> | <PERCENT> | <INTER> ) |
| CARET |
::= |
<CARET> |
| BangOperators |
::= |
( <BANG> | <BACKSLASH> | <AT> | <SND> | <SNDBK> ) |
| FirstClassOperators |
::= |
( <FIRSTCLASS> | <FUTURE> | <PIPE> | <COEXPR> | <PARALLEL> ) |
| UnaryOperators |
::= |
( <TILDE> | <PSETCUR> | <AT> | <BAR> | <CONCAT> | <LCONCAT> | <DOT> | <BANG> | <DECR> | <PLUS> | <STAR> | <CARET> | <INTER> | <MINUS> | <EQUALS> | <NMNE> | <EQ> | <RCV> | <RCVBK> | <SNE> | <EQUIV> | <INCR> | <QMARK> | <NEQUIV> ) |
| UnaryBooleanOperators |
::= |
( <SLASH> | <BACKSLASH> ) |
| PCOLON |
::= |
<PCOLON> |
| MCOLON |
::= |
<MCOLON> |
| DOLLAR |
::= |
<DOLLAR> |
| AT |
::= |
<AT> |
| LT |
::= |
<LT> |
| GT |
::= |
<GT> |
| SLASH |
::= |
<SLASH> |
| STAR |
::= |
<STAR> |
| EQUALS |
::= |
<EQUALS> |
| PUNEVAL |
::= |
<BACKQUOTE> |
//========================================================================
// Terminals: Identifiers
//========================================================================
|
| Identifier |
::= |
( <IDENTIFIER> | <NEW> | <IN> ) |
| StrictIdentifier |
::= |
( <IDENTIFIER> ) |
| RelaxedIdentifier |
::= |
( <IDENTIFIER> | <IN> | <NEXT> | <THREAD> | <INITIALLY> ) |
//========================================================================
// Terminals: Literals
//========================================================================
|
| BigLiteral |
::= |
<BIG_LITERAL> |
| IntLiteral |
::= |
( <INTEGER_LITERAL> | <RADIX_LITERAL> ) |
| RealLiteral |
::= |
<REAL_LITERAL> |
| CharLiteral |
::= |
<SINGLE_QUOTE_LITERAL> |
| StringLiteral |
::= |
<STRING_LITERAL> |
| NullLiteral |
::= |
<NULL_LITERAL> |
//========================================================================
// Terminals: Annotations
//========================================================================
|
| ANNOTATION |
::= |
<ANNOTATION> |
| ANNOTATION_COMMENT_PREFIX |
::= |
<ANNOTATION_COMMENT_PREFIX> |